/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Model.ProdutoModel;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Diego
 */
public class ProdutoDao {

    public static final int cNavPrimeiro = 0;
    public static final int cNavAnterior = 1;
    public static final int cNavProximo = 2;
    public static final int cNavUltimo = 3;

    public static void Salvar(ProdutoModel produto) {
        Connection conexao = FabricaConexao.GeraConexao();
        PreparedStatement insereSt = null;

        String sql = "insert into produto (COD_PROD, NOME_PROD, VALOR_PROD)"
                + "values(?,?,?);";
        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, produto.getCodProd());
            insereSt.setString(2, produto.getNomeProd());
            insereSt.setDouble(3, produto.getValorProd());


            insereSt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(ProdutoDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (SQLException ex) {
                Logger.getLogger(ProdutoDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

    public static void Alterar(ProdutoModel produto) {

        Connection conexao = FabricaConexao.GeraConexao();
        PreparedStatement insereSt = null;
        String sql = "update produto set COD_PROD=?, NOME_PROD=?, VALOR_PROD=? where COD_PROD=" + produto.getCodProd();

        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, produto.getCodProd());
            insereSt.setString(2, produto.getNomeProd());
            insereSt.setDouble(3, produto.getValorProd());


            insereSt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(ProdutoDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (SQLException ex) {
                Logger.getLogger(ProdutoDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

    public static ProdutoModel RecuperarProduto(int Cod) {

        Connection conexao = FabricaConexao.GeraConexao();
        ProdutoModel produtoRecuperado = new ProdutoModel();
        Statement consulta = null;
        ResultSet resultado = null;

        String sql = "select * from produto where COD_PROD=" + Cod;
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(sql);
            resultado.next();

            produtoRecuperado.setCodProd(resultado.getInt("COD_PROD"));
            produtoRecuperado.setNomeProd(resultado.getString("NOME_PROD"));
            produtoRecuperado.setValorProd(resultado.getDouble("VALOR_PROD"));


        } catch (SQLException ex) {
            Logger.getLogger(ProdutoDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(ProdutoDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        return produtoRecuperado;
    }

    public static List<ProdutoModel> RecuperaProdutos(String sql) {
        Connection conexao = FabricaConexao.GeraConexao();
        List<ProdutoModel> prod = new ArrayList<ProdutoModel>();
        try {
            Statement objSTM = conexao.createStatement();
            objSTM.executeQuery(sql);
            ResultSet objResultSet = objSTM.getResultSet();
            while (objResultSet.next()) {
                ProdutoModel x = new ProdutoModel();
                String vID = objResultSet.getString("COD_PROD");
                String vNome = objResultSet.getString("NOME_PROD");
                String Valor = objResultSet.getString("VALOR_PROD");

                x.setCodProd(Integer.parseInt(vID));
                x.setNomeProd(vNome);
                x.setValorProd(Double.parseDouble(Valor));
                prod.add(x);
            }
            objResultSet.close();
            objSTM.close();
        } catch (Exception erro) {
            String errorMsg = "Erro ao Recuperar: " + erro.getMessage();
            JOptionPane.showMessageDialog(null, errorMsg, "Mensagem", JOptionPane.ERROR_MESSAGE);
        }
        return prod;
    }
    public static int PegaCodPelaNavegacao (int iopcao, int iCodAtual){
        
        Connection conexao= FabricaConexao.GeraConexao();
        Statement consulta = null;
        ResultSet resultado = null;
        int CodEncontrado = -1;
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(ProdutoDao.SQLNavegacao( iopcao, iCodAtual));
            resultado.next();
            CodEncontrado= resultado.getInt("COD");
        } catch (SQLException ex) {
            Logger.getLogger(FabricaConexao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(FabricaConexao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        return CodEncontrado;      
        
        
    }


    public static String SQLNavegacao(int iopcao, int iCodAtual) {
        String sql = "";
        switch (iopcao) {
            case cNavPrimeiro:
                sql = " select min(COD_PROD) as COD from produto ";
                break;
            case cNavAnterior:
                sql = " select max(COD_PROD) as COD from produto where COD_PROD <" + String.valueOf(iCodAtual) + " ";
                break;
            case cNavProximo:
                sql = " select min(COD_PROD) as COD from produto where COD_PROD >" + String.valueOf(iCodAtual) + " ";
                break;
            case cNavUltimo:
                sql = " select max(COD_PROD) as COD from produto ";
                break;
        }
        return sql;
    }
    public static void Excluir(int CodAtual) {
        FabricaConexao.Excluir(CodAtual, "produto", "COD_PROD");
    }

    public static ArrayList<ProdutoModel> PesquisaObjeto(String NomeCampo, String Valor, boolean EmQualquerParte) {
        String sql = "select * from produto where " + NomeCampo + " like '";
        if(EmQualquerParte){
            sql=sql + "%";
        }
        sql = sql + Valor + "%'";
        
        return (ArrayList<ProdutoModel>) (List<ProdutoModel>) RecuperaProdutos(sql);
    }
}
